package sv.com.renacempleo.dso.red;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.tuckey.web.filters.urlrewrite.utils.StringUtils;

import sv.com.renacempleo.dso.BaseServiceImpl;
import sv.com.renacempleo.dto.ctg.CtgCatalogo;
import sv.com.renacempleo.dto.red.RedOferta;
import sv.com.renacempleo.dto.red.RedOfertaConocimiento;
import sv.com.renacempleo.dto.red.RedOfertaContacto;
import sv.com.renacempleo.dto.red.RedOfertaDatos;
import sv.com.renacempleo.dto.red.RedOfertaDatosEntrevista;
import sv.com.renacempleo.dto.red.RedOfertaDisponibilidad;
import sv.com.renacempleo.dto.red.RedOfertaDocumentos;
import sv.com.renacempleo.dto.red.RedOfertaFormacionAcademica;
import sv.com.renacempleo.dto.red.RedOfertaHabilidad;
import sv.com.renacempleo.dto.red.RedOfertaHorario;
import sv.com.renacempleo.dto.red.RedOfertaIdioma;
import sv.com.renacempleo.dto.red.RedOfertaOtrosRequisitos;
import sv.com.renacempleo.dto.red.RedOfertaPrestaciones;
import sv.com.renacempleo.dto.red.RedOfertaRequisitos;
import sv.com.renacempleo.dto.red.RedOfertaSucursales;
import sv.com.renacempleo.dto.red.vinculacion.RedEstadoSeguimientoOferta;
import sv.com.renacempleo.exception.WebException;
import sv.com.renacempleo.web.util.WebUtilidades;

public class RedOfertaServiceImpl extends BaseServiceImpl implements RedOfertaService{
	
	@Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false, rollbackFor = {Exception.class, WebException.class})
	public void saveRedOferta(RedOferta redOferta) throws WebException{
		try {
			if(redOferta.getRedOfertaId() == null || redOferta.getRedOfertaId() <= 0)
				redOferta.setRedOfertaFecha(WebUtilidades.dateFormatAsDD_MM_YYYY.format(new Date()));
			redOferta.setSgdUsuario(WebUtilidades.getSgdUsuarioFromAcegi());
			//if(StringUtils.isBlank(redOferta.getRedOfertaActivo())) 
			redOferta.setRedOfertaActivo("1");
			save(redOferta);
		} catch (Exception e) {
			logger.error(e, e);
			throw new WebException("Problemas al intentar actualizar la informaci\u00F3n de la Oferta");
		}
	}
	
	@Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false, rollbackFor = {Exception.class, WebException.class})
	public void saveRedOfertaDatos(RedOfertaDatos redOfertaDatos, String[] redOfertaPrestaciones) throws WebException{
		String hqlQuery = "delete from RedOfertaPrestaciones where redOferta.redOfertaId = :redOfertaId";
		Map<String, Object> parameters = new HashMap<String, Object>();
		Long redOfertaId = redOfertaDatos.getRedOferta().getRedOfertaId();
		parameters.put("redOfertaId", redOfertaId);
		executeNonHibernateQuery(hqlQuery, parameters);
		RedOfertaPrestaciones redOfertaPrestacion = null;
		if(redOfertaPrestaciones != null)
			for (String ctgPrestacionId : redOfertaPrestaciones) {
				redOfertaPrestacion = new RedOfertaPrestaciones();
				redOfertaPrestacion.setCtgPrestaciones(new CtgCatalogo(new Long(ctgPrestacionId)));
				redOfertaPrestacion.setRedOferta(new RedOferta(redOfertaId));
				save(redOfertaPrestacion);
			}
		save(redOfertaDatos);
	}
	
	@Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false, rollbackFor = {Exception.class, WebException.class})
	public void saveRedOfertaRequisitos(RedOfertaRequisitos redOfertaRequisitos, 
			String[] redOfertaDocumentos,
			String[] redOfertaOtrosRequisitos,
			String[] redOfertaDisponibilidades) throws WebException{
		String hqlQuery = "delete from RedOfertaDocumentos where redOferta.redOfertaId = :redOfertaId";
		Map<String, Object> parameters = new HashMap<String, Object>();
		Long redOfertaId = redOfertaRequisitos.getRedOferta().getRedOfertaId();
		parameters.put("redOfertaId", redOfertaId);
		executeNonHibernateQuery(hqlQuery, parameters);
		hqlQuery = "delete from RedOfertaOtrosRequisitos where redOferta.redOfertaId = :redOfertaId";
		executeNonHibernateQuery(hqlQuery, parameters);
		hqlQuery = "delete from RedOfertaDisponibilidad where redOferta.redOfertaId = :redOfertaId";
		executeNonHibernateQuery(hqlQuery, parameters);
		if(redOfertaDocumentos != null){
			RedOfertaDocumentos redOfertaDocumento = null;
			for (String ctgTipoDocumento : redOfertaDocumentos) {
				redOfertaDocumento = new RedOfertaDocumentos();
				redOfertaDocumento.setCtgDocumentos(new CtgCatalogo(new Long(ctgTipoDocumento)));
				redOfertaDocumento.setRedOferta(new RedOferta(redOfertaId));
				save(redOfertaDocumento);
			}
		}
		if(redOfertaOtrosRequisitos != null){
			RedOfertaOtrosRequisitos redOfertaOtrosRequisito = null;
			for (String ctgOtrosRequisitos : redOfertaOtrosRequisitos) {
				redOfertaOtrosRequisito = new RedOfertaOtrosRequisitos();
				redOfertaOtrosRequisito.setCtgOtrosRequisitos(new CtgCatalogo(new Long(ctgOtrosRequisitos)));
				redOfertaOtrosRequisito.setRedOferta(new RedOferta(redOfertaId));
				save(redOfertaOtrosRequisito);
			}
		}
		if(redOfertaDisponibilidades != null){
			RedOfertaDisponibilidad redOfertaDisponibilidad = null;
			for (String ctgDisponibilidad : redOfertaDisponibilidades) {
				redOfertaDisponibilidad = new RedOfertaDisponibilidad();
				redOfertaDisponibilidad.setCtgDisponibilidad(new CtgCatalogo(new Long(ctgDisponibilidad)));
				redOfertaDisponibilidad.setRedOferta(new RedOferta(redOfertaId));
				save(redOfertaDisponibilidad);
			}
		}
		save(redOfertaRequisitos);
	}
	
	@Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false, rollbackFor = {Exception.class, WebException.class})
	public void saveRedOfertaDatosEntrevista(RedOfertaDatosEntrevista redOfertaDatosEntrevista) throws WebException{
		save(redOfertaDatosEntrevista);
	}
	
	@Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false, rollbackFor = {Exception.class, WebException.class})
	public void delete(Long redOfertaId) throws WebException{
		String hqlQuery = "delete from RedOfertaDocumentos where redOferta.redOfertaId = :redOfertaId";
		Map<String, Object> parameters = new HashMap<String, Object>();
		parameters.put("redOfertaId", redOfertaId);
		parameters.put("redOfertaActivo", "1");
//		executeNonHibernateQuery(hqlQuery, parameters);
//		hqlQuery = "delete from RedOfertaOtrosRequisitos where redOferta.redOfertaId = :redOfertaId";
//		executeNonHibernateQuery(hqlQuery, parameters);
//		hqlQuery = "delete from RedOfertaDisponibilidad where redOferta.redOfertaId = :redOfertaId";
//		executeNonHibernateQuery(hqlQuery, parameters);
//		hqlQuery = "delete from RedOfertaPrestaciones where redOferta.redOfertaId = :redOfertaId";
//		executeNonHibernateQuery(hqlQuery, parameters);
//		hqlQuery = "delete from RedOfertaConocimiento where redOferta.redOfertaId = :redOfertaId";
//		executeNonHibernateQuery(hqlQuery, parameters);
//		hqlQuery = "delete from RedOfertaContacto where redOferta.redOfertaId = :redOfertaId";
//		executeNonHibernateQuery(hqlQuery, parameters);
//		hqlQuery = "delete from RedOfertaDatos where redOferta.redOfertaId = :redOfertaId";
//		executeNonHibernateQuery(hqlQuery, parameters);
//		hqlQuery = "delete from RedOfertaDatosEntrevista where redOferta.redOfertaId = :redOfertaId";
//		executeNonHibernateQuery(hqlQuery, parameters);
//		hqlQuery = "delete from RedOfertaFormacionAcademica where redOferta.redOfertaId = :redOfertaId";
//		executeNonHibernateQuery(hqlQuery, parameters);
//		hqlQuery = "delete from RedOfertaHabilidad where redOferta.redOfertaId = :redOfertaId";
//		executeNonHibernateQuery(hqlQuery, parameters);
//		hqlQuery = "delete from RedOfertaHorario where redOferta.redOfertaId = :redOfertaId";
//		executeNonHibernateQuery(hqlQuery, parameters);
//		hqlQuery = "delete from RedOfertaIdioma where redOferta.redOfertaId = :redOfertaId";
//		executeNonHibernateQuery(hqlQuery, parameters);
//		hqlQuery = "delete from RedOfertaRequisitos where redOferta.redOfertaId = :redOfertaId";
//		executeNonHibernateQuery(hqlQuery, parameters);
//		hqlQuery = "delete from RedOfertaSucursales where redOferta.redOfertaId = :redOfertaId";
//		executeNonHibernateQuery(hqlQuery, parameters);
		
		
		
		hqlQuery = "update RedOferta set redOfertaActivo = :redOfertaActivo where redOfertaId = :redOfertaId";
		executeNonHibernateQuery(hqlQuery, parameters);
	}
	
	@Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false, rollbackFor = {Exception.class, WebException.class})
	public void saveRedOfertaFormacionAcademica(RedOfertaFormacionAcademica redOfertaFormacionAcademica) throws WebException{
		save(redOfertaFormacionAcademica);
	}
	
	@Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false, rollbackFor = {Exception.class, WebException.class})
	public void deleteRedOfertaFormacionAcademica(Long redOfertaFormacionAcademicaId) throws WebException{
		String hqlQuery = "delete from RedOfertaFormacionAcademica where redOfertaFormacionAcademicaId = :redOfertaFormacionAcademicaId";
		Map<String, Object> parameters = new HashMap<String, Object>();
		parameters.put("redOfertaFormacionAcademicaId", redOfertaFormacionAcademicaId);
		executeNonHibernateQuery(hqlQuery, parameters);
	}
	
	@Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false, rollbackFor = {Exception.class, WebException.class})
	public void saveRedOfertaIdioma(RedOfertaIdioma redOfertaIdioma) throws WebException{
		save(redOfertaIdioma);
	}
	
	@Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false, rollbackFor = {Exception.class, WebException.class})
	public void deleteRedOfertaIdioma(Long redOfertaIdiomaId) throws WebException{
		String hqlQuery = "delete from RedOfertaIdioma where redOfertaIdiomaId = :redOfertaIdiomaId";
		Map<String, Object> parameters = new HashMap<String, Object>();
		parameters.put("redOfertaIdiomaId", redOfertaIdiomaId);
		executeNonHibernateQuery(hqlQuery, parameters);
	}
	
	@Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false, rollbackFor = {Exception.class, WebException.class})
	public void saveRedOfertaConocimiento(RedOfertaConocimiento redOfertaConocimiento) throws WebException{
		save(redOfertaConocimiento);
	}
	
	@Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false, rollbackFor = {Exception.class, WebException.class})
	public void deleteRedOfertaConocimiento(Long redOfertaConocimientoId) throws WebException{
		String hqlQuery = "delete from RedOfertaConocimiento where redOfertaConocimientoId = :redOfertaConocimientoId";
		Map<String, Object> parameters = new HashMap<String, Object>();
		parameters.put("redOfertaConocimientoId", redOfertaConocimientoId);
		executeNonHibernateQuery(hqlQuery, parameters);
	}
	
	@Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false, rollbackFor = {Exception.class, WebException.class})
	public void saveRedOfertaHabilidades(RedOfertaHabilidad redOfertaHabilidad) throws WebException{
		save(redOfertaHabilidad);
	}
	
	@Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false, rollbackFor = {Exception.class, WebException.class})
	public void deleteRedOfertaHabilidades(Long redOfertaHabilidadId) throws WebException{
		String hqlQuery = "delete from RedOfertaHabilidad where redOfertaHabilidadId = :redOfertaHabilidadId";
		Map<String, Object> parameters = new HashMap<String, Object>();
		parameters.put("redOfertaHabilidadId", redOfertaHabilidadId);
		executeNonHibernateQuery(hqlQuery, parameters);
	}
	
	@Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false, rollbackFor = {Exception.class, WebException.class})
	public void saveRedOfertaSucursales(RedOfertaSucursales redOfertaSucursales) throws WebException{
		save(redOfertaSucursales);
	}
	
	@Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false, rollbackFor = {Exception.class, WebException.class})
	public void deleteRedOfertaSucursales(Long redOfertaSucursalId) throws WebException{
		String hqlQuery = "delete from RedOfertaSucursales where redOfertaSucursalId = :redOfertaSucursalId";
		Map<String, Object> parameters = new HashMap<String, Object>();
		parameters.put("redOfertaSucursalId", redOfertaSucursalId);
		executeNonHibernateQuery(hqlQuery, parameters);
	}
	
	@Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false, rollbackFor = {Exception.class, WebException.class})
	public void saveRedOfertaContacto(RedOfertaContacto redOfertaContacto) throws WebException{
		save(redOfertaContacto);
	}
	
	@Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false, rollbackFor = {Exception.class, WebException.class})
	public void deleteRedOfertaContacto(Long redOfertaContactoId) throws WebException{
		String hqlQuery = "delete from RedOfertaContacto where redOfertaContactoId = :redOfertaContactoId";
		Map<String, Object> parameters = new HashMap<String, Object>();
		parameters.put("redOfertaContactoId", redOfertaContactoId);
		executeNonHibernateQuery(hqlQuery, parameters);
	}
	
	@Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false, rollbackFor = {Exception.class, WebException.class})
	public void saveRedOfertaHorario(RedOfertaHorario redOfertaHorario) throws WebException{
		save(redOfertaHorario);
	}
	
	@Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false, rollbackFor = {Exception.class, WebException.class})
	public void deleteRedOfertaHorario(Long redOfertaHorarioId) throws WebException{
		String hqlQuery = "delete from RedOfertaHorario where redOfertaHorarioId = :redOfertaHorarioId";
		Map<String, Object> parameters = new HashMap<String, Object>();
		parameters.put("redOfertaHorarioId", redOfertaHorarioId);
		executeNonHibernateQuery(hqlQuery, parameters);
	}

	@Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false, rollbackFor = {Exception.class, WebException.class})
	public void activarOferta(Long redOfertaId, String redOfertaActivo) throws WebException {
		String hqlQuery = "update RedOferta set redOfertaActivo= :redOfertaActivo where redOfertaId= :redOfertaId";
		Map<String, Object> parameters = new HashMap<String, Object>();
		parameters.put("redOfertaId", redOfertaId);
		parameters.put("redOfertaActivo", redOfertaActivo);
		executeNonHibernateQuery(hqlQuery, parameters);
		
	}

	@Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false, rollbackFor = {Exception.class, WebException.class})
	public void cambiarEstadoOferta(RedEstadoSeguimientoOferta redEstadoSeguimientoOferta) throws WebException {
		String hqlQuery = "";
		save(redEstadoSeguimientoOferta);
		
		if(redEstadoSeguimientoOferta.getRedOferta()!=null){
			hqlQuery = "update RedOferta set ctgEstadoVacanteVinculacion.ctgEstadoVacanteVinculacionId = :ctgEstadoVacanteVinculacionId" +
					" where redOfertaId = :redOfertaId";
			Map<String, Object> parameters = new HashMap<String, Object>();
			parameters.put("ctgEstadoVacanteVinculacionId", redEstadoSeguimientoOferta.getCtgEstadoVacanteVinculacion().getCtgEstadoVacanteVinculacionId());
			parameters.put("redOfertaId", redEstadoSeguimientoOferta.getRedOferta().getRedOfertaId());
			executeNonHibernateQuery(hqlQuery, parameters);
		}
			
		
	}
}
